﻿using GamFi.Admin.API.Application.Contracts.User.GetUsers;
using GamFi.Admin.API.Application.Contracts.User.UpdateUser;
using GamFi.Admin.API.Application.Features.Queries.User.DeleteUser;
using GamFi.Admin.API.Application.Features.Queries.User.GetUsers;
using GamFi.Admin.API.Application.Features.Queries.User.UpdateUser;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace GamFi.Admin.API.WEB.Controllers;

/// <summary>
/// Контроллер отвечающий за действия с аккаунтом
/// </summary>
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class UserController(IMediator mediator) : ControllerBase
{
    /// <summary>
    /// Получает список пользователей.
    /// </summary>
    /// <param name="request">Запрос на получение списка пользователей.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ с информацией о пользователях.</returns>
    [HttpGet("GetUsers")]
    public async Task<GetUsersResponse> GetUser([FromQuery] GetUsersRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new GetUsersQuery(request), cancellationToken);

    /// <summary>
    /// Обновление данных пользователя
    /// </summary>
    /// <param name="request">PatchUpdateUserInfoRequest</param>
    /// <param name="cancellationToken">Токен отмены</param>
    [HttpPatch("UpdateUser")]
    public async Task UpdateUserInfo(UpdateUserRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new UpdateUserCommand(request), cancellationToken);
    
    /// <summary>
    /// Удаляет пользователя по его идентификатору.
    /// </summary>
    /// <param name="id">Идентификатор пользователя, которое требуется удалить.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат удаления.</returns>
    [HttpDelete("DeleteUser/{id:guid}")]
    public async Task DeleteUser(Guid id, CancellationToken cancellationToken)
        => await mediator.Send(new DeleteUserCommand(id), cancellationToken);
}